package view;

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JLabel;
import javax.swing.JPanel;

import model.Admin;
import model.CiiBay;
import model.Gebruiker;
import model.Persoon;


/**
 * Deze klasse geeft opties en gegevens weer voor als er een persoon is ingelogd.
 * @author Yasper
 * @author Dennis
 * @author Jaap
 * @author Yoeri
 * @author Marvin
 */
@SuppressWarnings("serial")
public class OptiePaneel extends JPanel implements Observer {
	private CiiBay ciiBay;
	private JLabel zoekGebruiker, naam, inbox, plaatsArtikel, mijnArtikelen, totaalOverzicht, voegCategorieToe, gebruikerBlokkeren, reputatie;
	private Persoon p;
	/**
	 * Deze methode kiest hoe het Optiepaneel opgebouwd moet worden.
	 * @author Yasper
	 * @author Dennis
	 * @author Jaap
	 * @author Yoeri
	 * @author Marvin
	 * @since V1.0
	 */
	public OptiePaneel(CiiBay ciiBay, Totaalscherm totaal) {
		this.ciiBay = ciiBay;
		ciiBay.addObserver(this);
		setBackground(Color.ORANGE);
	}

	/**
	 * Deze methode maakt het gebruikersscherm voor als een gebruiker is ingelogd en laat bepaalde informatie zien.
	 * @author Yasper, Dennis, Jaap, Marvin
	 * @since V1.0
	 */
	public void gebruikersPanel(Persoon p){
		if(p != null){
			this.p = p;
			setLayout(new GridBagLayout());
			GridBagConstraints c = new GridBagConstraints();

			naam = new JLabel("Naam: "+p.getNaam()+"");
			reputatie = new JLabel();
			if(p instanceof Gebruiker){
				Gebruiker g = (Gebruiker)p;
				reputatie.setText("rep: " + g.getReputatie()+"");
			}

			inbox = new JLabel("Mailbox ("+p.getMailbox().aantalOngelezen()+")");
			plaatsArtikel = new JLabel("Plaats artikel");
			mijnArtikelen = new JLabel("Mijn artikelen");
			totaalOverzicht = new JLabel("Totaal overzicht");
			voegCategorieToe = new JLabel("Voeg categorie toe");
			gebruikerBlokkeren = new JLabel("Blokkeer een gebruiker");

			if (p instanceof Admin) {
				zoekGebruiker = new JLabel("Zoek een gebruiker");
				voegCategorieToe.addMouseListener(new CategorieListener());
				gebruikerBlokkeren.addMouseListener(new BlokkeerGebruikerListener());
				zoekGebruiker.addMouseListener(new ZoekGebruikerListener());
			}

			//listeners toevoegen
			inbox.addMouseListener(new InboxListener());
			plaatsArtikel.addMouseListener(new PlaatsArtikelListener());
			mijnArtikelen.addMouseListener(new MijnArtikelenListener());
			totaalOverzicht.addMouseListener(new TotaalOverzichtListener());


			//layout
			c.fill = GridBagConstraints.HORIZONTAL;
			c.gridx = 0;
			c.gridy = 0;
			add(naam,c);
			c.gridy = 1;
			if(p instanceof Gebruiker)
				if(((Gebruiker) p).getReputatie() != 0.0) {
				add(reputatie, c);
				} else {
					reputatie.setText("rep: Nog geen reputatie!");
					add(reputatie,c);
				}
			c.gridy = 2;
			c.insets = new Insets(500,0,0,5);
			add(inbox, c);
			c.insets = new Insets(0,0,0,5);
			c.weighty = 0;
			c.gridy = 3;
			if(p instanceof Gebruiker){
				add(plaatsArtikel, c);
				c.insets = new Insets(0,0,0,5);
				c.gridy = 4;
				add(mijnArtikelen, c);
				c.gridy = 5;
				add(totaalOverzicht, c);
			}
			if(p instanceof Admin){
				add(voegCategorieToe,c);
				c.insets = new Insets(0,0,0,5);
				c.gridy = 4;
				add(gebruikerBlokkeren,c);
				c.gridy = 5;
				add(zoekGebruiker,c);
			}
		}
		zetLabels(null);
	}


	@Override
	public void update(Observable arg0, Object arg1) {
		String message = (String) arg1;
		if(message.equals("inloggen")){
			gebruikersPanel(ciiBay.getIngelogtPersoon());
			revalidate();
		}else if(message.equals("uitloggen")){
			this.removeAll();
			revalidate();
		}
		if(ciiBay.getIngelogtPersoon() != null && inbox != null) {
			p.getMailbox().addBerichten(ciiBay);
			inbox.setText("Mailbox("+p.getMailbox().aantalOngelezen()+")");
		}
	}

	/**
	 * Deze methode zet alle labels in hun originele staat, ook veranderd hij er 1 naar een ander kleurtje.
	 * @author Yasper
	 * @since V1.0
	 */
	public void zetLabels(JLabel jl) {
		inbox.setForeground(Color.blue);
		plaatsArtikel.setForeground(Color.blue);
		mijnArtikelen.setForeground(Color.blue);
		totaalOverzicht.setForeground(Color.blue);
		voegCategorieToe.setForeground(Color.blue);
		gebruikerBlokkeren.setForeground(Color.blue);
		if(ciiBay.getIngelogtPersoon() instanceof Admin) {
			zoekGebruiker.setForeground(Color.blue);
		}
		if(jl != null){
			jl.setForeground(Color.RED);
		}

	}

	//Listeners

	/**
	 *	Deze klasse brengt je naar je inbox.
	 * @author Yasper
	 */
	class InboxListener extends MouseAdapter {
		@Override
		public void mouseClicked(MouseEvent arg0) {
			ciiBay.inlezen();
			p.getMailbox().addBerichten(ciiBay);
			ciiBay.veranderView("mailbox");
			zetLabels(inbox);
		}	
	}

	/**
	 * 
	 * @author Yoeri
	 * @author Marvin
	 */
	class CategorieListener extends MouseAdapter {
		public void mouseClicked(MouseEvent arg0) {
			ciiBay.veranderView("voegCategorieToe");
			zetLabels(voegCategorieToe);
		}
	}

	/**
	 *	Deze klasse brengt je naar een nieuwe advertentie aanmaak view.
	 * @author Yasper
	 */
	class PlaatsArtikelListener extends MouseAdapter {
		@Override
		public void mouseClicked(MouseEvent arg0) {
			ciiBay.veranderView("AdvertentieAanmaakView");
			zetLabels(plaatsArtikel);
		}	
	}

	/**
	 * Deze klasse brent je naar je eigen artikelenpagina.
	 * @author Yasper
	 */
	class MijnArtikelenListener extends MouseAdapter {
		@Override
		public void mouseClicked(MouseEvent arg0) {
			ciiBay.zoekAdvertentiesGebruiker();
			zetLabels(mijnArtikelen);
		}	
	}

	/**
	 * Deze klasse geeft het totaaloverzicht weer.
	 * @author Yasper
	 */
	class TotaalOverzichtListener extends MouseAdapter {
		@Override
		public void mouseClicked(MouseEvent arg0) {
			ciiBay.veranderView("totaalOverzicht");
			zetLabels(totaalOverzicht);
		}	
	}

	/**
	 * Hier word de view verandering doorgegeven
	 * @author Dennis
	 */
	class BlokkeerGebruikerListener extends MouseAdapter{
		@Override
		public void mouseClicked(MouseEvent arg0) {
			ciiBay.veranderView("blokkeren");
			zetLabels(gebruikerBlokkeren);
		}	
	}

	/**
	 * Deze klasse brengt je naar een zoekgebruiker scherm.
	 * @author Dennis
	 */
	class ZoekGebruikerListener extends MouseAdapter{
		@Override
		public void mouseClicked(MouseEvent arg0) {
			ciiBay.veranderView("zoekGebruiker");
			zetLabels(zoekGebruiker);
		}
	}
}
